/*************************************************************************************
 * Nombre del archivo: Main.java
 * Universidad del Valle de Guatemala
 * Curso: Diseño de Lenguajes de Programación
 * @author martin
 *          Martín Guzmán 08041
 * Fecha: Abril de 2010
 * Descripción: Segundo proyecto. Generador de analizador léxico
*************************************************************************************/

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JFileChooser;

public class Main {

    public static String path_to_save="/home/martin/Desktop";
    private static boolean debug = false;

    private static Scanner scan = new Scanner(System.in);
    private static int hacer;
    private static int opciones_del_menu = 0;
    private static LinkedList<String> file_lines = new LinkedList<String>();

    //método main donde empieza la ejecución del programa
    public static void main(String args[])
    {
        System.out.println("\n****************************************************************************************************************");
        System.out.println("  ____                            _           _   _         ____  "+"\n"+
                            " |  _ \\ _ __ ___  _   _  ___  ___| |_  ___   | \\ | | ___   |___ \\ "+"\n"+
                            " | |_) | '__/ _ \\| | | |/ _ \\/ __| __|/ _ \\  |  \\| |/ _ \\    __) |"+"\n"+
                            " |  __/| | | (_) | |_| |  __/ (__| |_| (_) | | |\\  | (_) |_ / __/ "+"\n"+
                            " |_|   |_|  \\___/ \\__, |\\___|\\___|\\__|\\___/  |_| \\_|\\___/(_)_____|"+"\n"+
                            "                  |___/                                           ");
        System.out.println("****************************************************************************************************************");

        //ciclo para repetir hasta que quiera salir del programa
        do
        {
            Menu();
        } while (hacer!=opciones_del_menu);//hasta que precione salir
        System.out.println("\n¡Gracias por utilizar el programa!");
    }

    //método que despliega el menú para realizar la acción del usuario ****************************
    public static void Menu(){
        do //ciclo hasta que ingrese bien una acción a realizar
        {

            opciones_del_menu=0;

            System.out.println("\n\t******** Menu Principal ********\n");
            System.out.println((++opciones_del_menu)+"- Ingresar archivo de entrada");
            System.out.println((++opciones_del_menu)+"- Generar analizador léxico");
            System.out.println((++opciones_del_menu)+"- Salir del Programa");
            System.out.print("\t >> ¿Qué desea hacer?\tMarque el número: ");
            //despliega mensaje de error si no escoje una opcion del menu principal
            try{
                hacer=scan.nextInt();
            }
            catch(Exception exp){ //para prevenir el ingreso de algún caracter diferente a número
                System.out.println("¡Error accion no válida!\n");
                hacer=-1;
            }
            scan.nextLine();
            if ((hacer<1 || hacer>opciones_del_menu) &&(hacer!=-1))
                System.out.println("¡Error accion fuera de las opciones!\n");

        } while (hacer<1 || hacer>opciones_del_menu);
        System.out.println("\n*************************************************************\n");

        // ========= para realizar la accion marcada arriba =============================================
        switch (hacer)
        {
            case 1://  ********* 1- Ingresar archivo de entrada *****************************************

                file_lines = Obtener_Archivo();
                // --------------------------------------
                // imprimir archivo
                /*
                for(int i=0;i<file_lines.size();i++){
                    Print(file_lines.get(i));
                }
                 */
                // --------------------------------------
                break;
                //***************************************************************************************
            case 2://  ********* 2- Generar analizador léxico *******************************************
                
                if(file_lines!=null){
                    Generador_Analizador_Lexico1 generator = new Generador_Analizador_Lexico1(file_lines);
                }
                else{
                    Print("Aún no se ha seleccionado archivo");
                }

                break;
                //***************************************************************************************
        }
        // ==============================================================================================
    }

    /***********************************************
     * Método: Obtener_Archivo
     * Uso: Obtiene el contenido de un archivo
     *      seleccionado desde dentro del método
     * @return LinkedList<String>
    ***********************************************/
    private static LinkedList<String> Obtener_Archivo() {

        LinkedList<String> arch = new LinkedList<String>();
        //----------------------------------------------------------------------

        File file;

        JFileChooser chooser = new JFileChooser("/home/martin/Desktop");
        int status = chooser.showOpenDialog(null);
        if(status !=JFileChooser.APPROVE_OPTION){
            Print("\tNo se seleccionó ningún archivo");
            return null;
        }
        //----------------------------------------------------------------------
        file = chooser.getSelectedFile();

        //file = new File("/home/martin/Desktop/cocol.txt");
        Scanner scan_file;

        try {
            scan_file = new Scanner(file);
             while(scan_file.hasNext()){
                arch.add(scan_file.nextLine());
            }
        } catch (Exception ex) {
            Print("\tEl archivo no se pudo abrir");
        }
        //Main.Print("archivo, recien leido: \n"+arch.toString());
        //----------------------------------------------------------------------
        // -------- borrar las líneas vacías -----------------------------------
        for(int i=0;i<arch.size();i++){
            if(Pattern.matches("\\s", arch.get(i)) | Pattern.matches("", arch.get(i))){
                arch.remove(i--);
            }
        }
        //----------------------------------------------------------------------
        return arch;
    }

    /***********************************************
     * Método: Print
     * Uso: Imprime el contenido de print
     * @param print
     * @return void
    ***********************************************/
    public static void Print(String print){
        System.out.println(print);
    }

    /***********************************************
     * Método: PrintDB
     * Uso: Imprime el contenido de print si se desea
     *      imprimir con debug
     * @param print
     * @return void
    ***********************************************/
    public static void PrintDB(String print){
        if(debug){
            System.out.println(print);
        }
    }

}
